package tests;
import modelo.*;
import junit.framework.TestCase;
import utilitarios.DireccionArriba;
import utilitarios.DireccionDerecha;
import utilitarios.PuntoXY;

public class PruebasTanqueDisparando extends TestCase {
	
	private TanqueAlgo tanque;
	private TanqueAlgo enemigo;
	private Escenario escenario;
	private ParedDeConcreto pared;
	
	@Override
    public void setUp() {
		escenario = new Escenario(300, 300);
	}
	
	public void testTanqueQueDisparaAEnemigoADerechaYalLadoDaniaAenemigo() {

		// El enemigo esta a la derecha del tanque, pegado a el

		// TANQUE ENEMIGO
		tanque = new TanqueAlgo(escenario, new PuntoXY(15, 15));
		tanque.girar(new DireccionDerecha());
		enemigo = new TanqueAlgo(escenario, new PuntoXY(45, 15));

		escenario.agregarObjeto(tanque);
		escenario.agregarObjeto(enemigo);

		double resistenciaInicialEnemigo = enemigo.getResistencia();
		double puntosQueQuita = tanque.getArma().getDanio();

		// Disparo a la derecha, deberia pegarle al enemigo
		// Hago que el escenario viva un tiempo
		tanque.disparar();
		for(int i = 1; i < 5; i++) {
			escenario.vivir();
		}

		// Compruebo que el enemigo tiene menos puntos de resistencia
		assertEquals(resistenciaInicialEnemigo - puntosQueQuita, enemigo.getResistencia());	
	}

	public void testTanqueQueDisparaAEnemigoADerechaYalejadoDaniaAenemigo() {

		// El enemigo esta a la derecha del tanque, alejado en X
		//
		// TANQUE            ENEMIGO
		tanque = new TanqueAlgo(escenario, new PuntoXY(15, 15));
		tanque.girar(new DireccionDerecha());
		enemigo = new TanqueAlgo(escenario, new PuntoXY(70, 15));

		escenario.agregarObjeto(tanque);
		escenario.agregarObjeto(enemigo);

		double resistenciaInicialEnemigo = enemigo.getResistencia();
		double puntosQueQuita = tanque.getArma().getDanio();

		// Disparo a la derecha, deberia pegarle al enemigo
		// Hago que el escenario viva un tiempo
		tanque.disparara();
		for(int i = 1; i < 8; i++) {
			escenario.vivir();
		}

		// Compruebo que el enemigo tiene menos puntos de resistencia
		assertEquals(resistenciaInicialEnemigo - puntosQueQuita, enemigo.getResistencia());
	}

	public void testTanqueQueDisparaADerechaYEnemigoEstaArribaYaDerechaNoDaniaAEnemigo() {

		// El enemigo esta a la derecha y arriba del tanque	
		tanque = new TanqueAlgo(escenario, new PuntoXY(0.5, 0.5));
		tanque.girar(new DireccionDerecha());
		enemigo = new TanqueAlgo(escenario, new PuntoXY(1.5, 5.5));

		escenario.agregarObjeto(tanque);
		escenario.agregarObjeto(enemigo);

		double resistenciaInicialEnemigo = enemigo.getResistencia();

		// Disparo a la derecha, NO deberia pegarle a "enemigo"
		tanque.disparar();
		for(int i = 1; i < 100; i++) {
			escenario.vivir();
		}

		// Compruebo que el enemigo NO tiene menos puntos de resistencia
		assertEquals(resistenciaInicialEnemigo, enemigo.getResistencia());
	}

	public void testTanqueQueDisparaADerechaYNoDaniaAenemigoQueSeMueveHaciaLaPosicionDeLaBala() {

		// El enemigo esta a la derecha y abajo de nuestro tanque
		tanque = new TanqueAlgo(escenario, new PuntoXY(0.5, 1.5));
		tanque.girar(new DireccionDerecha());
		enemigo = new TanqueAlgo(escenario, new PuntoXY(1.5, 0.5));

		escenario.agregarObjeto(tanque);
		escenario.agregarObjeto(enemigo);

		double resistenciaInicialEnemigo = enemigo.getResistencia();

		// El tanque dispara a la derecha y el enemigo se mueve hacia arriba
		tanque.disparar();		
		enemigo.seMovera(new DireccionArriba());
		for (int i = 1; i < 5; i++) {
			escenario.vivir();
		}

		// El enemigo SI deberia ser alcanzado por la bala
		assertEquals(resistenciaInicialEnemigo, enemigo.getResistencia());			

	}

	public void testTanqueQueDisparaAEnemigoQueEsquivaBalayEnemigoNoRecibeImpacto() {

		// El enemigo esta a la derecha de nuestro tanque (alejado),
		// listo para ser alcanzado

		tanque = new TanqueAlgo(escenario, new PuntoXY(0.5, 0.5));
		tanque.girar(new DireccionDerecha());
		enemigo = new TanqueAlgo(escenario, new PuntoXY(4.5, 0.5));

		escenario.agregarObjeto(tanque);
		escenario.agregarObjeto(enemigo);

		double resistenciaInicialEnemigo = enemigo.getResistencia();

		// El tanque se prepara para disparar a la derecha 
		// y el enemigo se movera hacia arriba
		tanque.disparara();
		enemigo.seMovera(new DireccionArriba());
		for (int i = 1; i < 5; i++) {
			escenario.vivir();
		}

		// El enemigo NO deberia ser alcanzado por la bala
		assertEquals(resistenciaInicialEnemigo, enemigo.getResistencia());		

	}

	public void testTanqueQueDisparaAParedyNoDaniaAEnemigoQueEstaDetrasDeLaPared() {
		
		// El enemigo esta a la derecha de nuestro tanque (alejado),
		// listo para ser alcanzado
		//
		//
		// TANQUE         PARED           ENEMIGO
		pared = new ParedDeConcreto(escenario, new PuntoXY(45, 15));
		tanque = new TanqueAlgo(escenario, new PuntoXY(15, 15));
		tanque.girar(new DireccionDerecha());
		enemigo = new TanqueAlgo(escenario, new PuntoXY(75, 15));

		escenario.agregarObjeto(pared);
		escenario.agregarObjeto(tanque);
		escenario.agregarObjeto(enemigo);

		double resistenciaInicialEnemigo = enemigo.getResistencia();

		// Hay un enemigo alcanzable, pero hay una pared en el medio
		// El tanque dispara hacia la derecha
		tanque.disparar();
		for(int i = 1; i < 50; i++) {
			escenario.vivir();
		}

		// El enemigo NO deberia ser alcanzado por la bala,
		// La pared SI deberia ser destruida
		assertEquals(true, pared.debeMorir());
		assertEquals(resistenciaInicialEnemigo, enemigo.getResistencia());
	}
}
